package user

import (
	"5title_gin/internal/api/middleware"
	"5title_gin/internal/model"
	"5title_gin/internal/model/user"
	userService "5title_gin/internal/service/user"
	"5title_gin/pkg/utils/http"
	"github.com/gin-gonic/gin"
	"strconv"
)

type UserAPI struct {
	service *userService.UserService
}

func NewUserAPI() *UserAPI {
	return &UserAPI{
		service: userService.NewUserService(),
	}
}

// UserListView 用户列表查询
// @Tags 用户管理
// @Summary 用户列表查询
// @Description 用户列表查询
// @Param token header string true "token"
// @Param order query string false "排序方式"
// @Param page query int false "页码"
// @Param pageSize query int false "每页大小"
// @Param search query string false "搜索关键字"
// @Router /api/users/list [get]
// @Produce json
// @Success 200 {object} http.Response
func (api *UserAPI) UserListView(c *gin.Context) {
	userBoList := middleware.GetBind[model.PageInfo](c)

	userVOList, total, err := api.service.GetUserList(userBoList)
	if err != nil {
		http.FailWithMsg(err.Error(), c)
		return
	}

	http.OkWithList(userVOList, total, c)
}

// GetUserInfo 获取用户信息
// @Tags 用户管理
// @Summary 获取用户信息
// @Description 根据 Token 获取当前登录用户的信息
// @Router /api/users/info [get]
// @Produce json
// @Success 200 {object} http.Response{data=user.UserModel}
func (api *UserAPI) GetUserInfo(c *gin.Context) {
	userID, exists := c.Get("userID")
	if !exists {
		http.FailWithMsg("获取用户ID失败", c)
		return
	}
	userInfo, err := api.service.GetUserInfo(userID.(uint))
	if err != nil {
		http.FailWithMsg("获取用户信息失败", c)
		return
	}

	// 返回用户信息
	http.Ok(userInfo, "获取用户信息成功", c)
}

// UpdateUserInfo 更新用户信息
// @Tags 用户管理
// @Summary 更新用户信息
// @Description 更新当前登录用户的信息
// @Router /api/updateUserInfo [post]
// @Produce json
func (api *UserAPI) UpdateUserInfo(c *gin.Context) {
	userInfo := middleware.GetBind[user.UserModel](c)
	if err := api.service.UpdateUserInfo(userInfo); err != nil {
		http.Error("更新用户信息失败", err, c)
		return
	}

	http.OkWithMsg("更新用户信息成功", c)
}

// GetUserById 根据ID获取用户信息
func (api *UserAPI) GetUserById(c *gin.Context) {
	param := c.Param("id")
	// 转换字符串为 uint
	userId, err := strconv.ParseUint(param, 10, 64)
	if err != nil {
		http.FailWithMsg("用户ID格式错误", c)
		return
	}
	userInfo, err := api.service.GetUserInfo(uint(userId))
	if err != nil {
		http.FailWithMsg("获取用户信息失败", c)
	}
	http.Ok(userInfo, "获取用户信息成功", c)
}

// CreateUser 新增用户
func (api *UserAPI) CreateUser(c *gin.Context) {
	userInfo := middleware.GetBind[user.UserModel](c)
	if err := api.service.CreateUser(userInfo); err != nil {
		http.FailWithMsg("新增用户失败", c)
		return
	}

	http.OkWithMsg("新增用户成功", c)
}

// DeleteUser 删除用户
func (api *UserAPI) DeleteUser(c *gin.Context) {
	param := c.Param("id")
	// 转换字符串为 uint
	userId, err := strconv.ParseUint(param, 10, 64)
	if err != nil {
		http.FailWithMsg("用户ID格式错误", c)
		return
	}
	if err := api.service.DeleteUser(uint(userId)); err != nil {
		http.FailWithMsg("删除用户失败", c)
		return
	}
	http.OkWithMsg("删除用户成功", c)
}
